package com.superman.supermarket.client.event;

import java.util.Map;

import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.superman.supermarket.client.event.CartPageEvent.CartPageEventHandler;

/**
 * 购物车页面事件定义
 * 
 * @author superman
 * @version 2018年7月12日下午4:21:31
 */
public class CartPageEvent extends GwtEvent<CartPageEventHandler> {

	/**
	 * 事件处理器
	 * 
	 * @author superman
	 * @version 2018年7月12日下午4:22:00
	 */
	public interface CartPageEventHandler extends EventHandler {
		/**
		 * 全选
		 * 
		 * @author superman
		 * @version 2018年8月9日 下午1:55:40
		 * @param check
		 */
		void checkAll(boolean check);

		/**
		 * 选中商品
		 * 
		 * @author superman
		 * @version 2018年8月8日 下午11:39:49
		 * @param map
		 */
		void checkSku(Map<String, Object> map);

		/**
		 * 选中店铺
		 * 
		 * @author superman
		 * @version 2018年8月9日 上午10:38:01
		 * @param storeId
		 */
		void checkStore(String storeId);

		/**
		 * 删除
		 * 
		 * @author superman
		 * @version 2018年8月9日 下午4:34:37
		 * @param skuId
		 */
		void delete(String skuId);

		/**
		 * 结算
		 * 
		 * @author superman
		 * @version 2018年8月10日 下午10:03:14
		 */
		void settlement();

		/**
		 * 取消选中商品
		 * 
		 * @author superman
		 * @version 2018年8月8日 下午11:39:51
		 * @param map
		 */
		void unCheckSku(Map<String, Object> map);

		/**
		 * 取消选中店铺
		 * 
		 * @author superman
		 * @version 2018年8月9日 上午10:38:04
		 * @param storeId
		 */
		void uncheckStore(String storeId);

		/**
		 * 跟新价格
		 * 
		 * @author superman
		 * @version 2018年8月9日 下午11:28:15
		 */
		void updatePrice(Map<String, Object> map);

	}

	/**
	 * 页面事件类型定义
	 * 
	 * @author superman
	 * @version 2018年8月4日下午8:40:11
	 */
	public enum CartPageEventType {
		CHEACK_ALL, CHECK_SKU, CHECK_STORE, DELETE, SETTLEMENT, UNCHECK_SKU, UNCHECK_STORE, UPDATE_PRICE;
	}

	public static final Type<CartPageEventHandler> TYPE = new Type<CartPageEventHandler>();

	private Object context;
	private CartPageEventType eventType;

	/**
	 * 构造方法
	 * 
	 * @author superman
	 * @version 2018年8月4日 下午8:42:05
	 * @param eventType
	 */
	public CartPageEvent(CartPageEventType eventType) {
		this.eventType = eventType;
	}

	/**
	 * 构造方法
	 * 
	 * @author superman
	 * @version 2018年8月4日 下午8:42:08
	 * @param eventType
	 * @param context
	 */
	public CartPageEvent(CartPageEventType eventType, Object context) {
		this.eventType = eventType;
		this.context = context;
	}

	@Override
	protected void dispatch(CartPageEventHandler handler) {
		switch (this.eventType) {
			case CHECK_SKU:
				handler.checkSku((Map<String, Object>) context);
				break;
			case UNCHECK_SKU:
				handler.unCheckSku((Map<String, Object>) context);
				break;
			case CHECK_STORE:
				handler.checkStore((String) context);
				break;
			case UNCHECK_STORE:
				handler.uncheckStore((String) context);
				break;
			case CHEACK_ALL:
				handler.checkAll((boolean) context);
				break;
			case DELETE:
				handler.delete((String) context);
				break;
			case UPDATE_PRICE:
				handler.updatePrice((Map<String, Object>) context);
				break;
			case SETTLEMENT:
				handler.settlement();
				break;
			default:
				break;
		}
	}

	@Override
	public Type<CartPageEventHandler> getAssociatedType() {
		return TYPE;
	}

}
